/*
 * Copyright 2013 Peter Lawrey
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.higherfrequencytrading.chronicle.fix;

import com.higherfrequencytrading.chronicle.Excerpt;
import com.higherfrequencytrading.chronicle.StopCharTesters;
import org.jetbrains.annotations.NotNull;

import java.io.IOException;

/**
 * @author peter.lawrey
 */
public class FixDecoder {
    @NotNull
    private final FixSocketReader reader;
    @NotNull
    private final Excerpt excerpt;

    public FixDecoder(@NotNull FixSocketReader reader) {
        this.reader = reader;
        excerpt = reader.excerpt().chronicle().createExcerpt();
    }

    public boolean readMessages(@NotNull FixDecodeListener listener) throws IOException {
        boolean more = false;
        if (!reader.readMessages())
            return false;
        while (excerpt.nextIndex()) {
            more = true;
            int length = (int) excerpt.readStopBit();
            while (excerpt.position() < length) {
                int fid = (int) excerpt.parseLong();
                if (fid == 10) {
                    listener.onEndOfMessage();
                    excerpt.skipTo(StopCharTesters.FIX_TEXT);
                } else {
                    listener.onField(fid, excerpt);
                    // skip tot he end of the field in case we didn't consume it.
                    excerpt.stepBackAndSkipTo(StopCharTesters.FIX_TEXT);
                }
            }
        }
        if (more)
            listener.onEndOfBatch();
        return more;
    }
}
